home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 46
/
Amiga Format CD46 (1999-10-20)(Future Publishing)(GB)[!][issue 1999-12].iso
/
-serious-
/
programming
/
other
/
hexy
/
src
/
hexy_main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-09-06
|
18KB
|
763 lines
/*
* [!BGN - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
* Program : Hexy (Binary file viewer/editor for the Amiga.)
* Version : 1.6
* File : Work:Source/!WIP/HisoftProjects/Hexy/Hexy_main.c
* Author : Andrew Bell
* Copyright : Copyright © 1998-1999 Andrew Bell (See GNU GPL)
* Created : Saturday 28-Feb-98 16:00:00
* Modified : Sunday 22-Aug-99 23:31:45
* Comment :
*
* (Generated with StampSource 1.2 by Andrew Bell)
*
* [!END - MACHINE GENERATED - DO NOT EDIT THIS HEADER]
*
*/
/* Created: Thu/26/Feb/1998 */
#include <Hexy.h>
/*
* Hexy, binary file viewer and editor for the Amiga.
* Copyright (C) 1999 Andrew Bell
*
* Author's email address: andrew.ab2000@bigfoot.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#define ARGPLATE "FILE,ASCII/S" /* Move this to Hexy_main.h */
/* Prototypes */
Prototype BOOL InitPrg( void );
Prototype void ExitPrg( void );
Prototype void ParseEvents( void );
Prototype void DEBUG( void );
Prototype void IDCMP_MAIN( void );
Prototype BOOL IDCMP_CheckRAWKEYS( void );
Prototype ULONG stream[], aa[], WaitFlags, SigFlag_IDCMP;
Prototype UBYTE CurFileLoaded[];
Prototype BOOL NoFileToLoad;
Prototype struct VCtrl VC;
Prototype struct Process *Proc;
Prototype struct RDArgs *ArgInfo;
Prototype struct MsgPort *WinPort;
Prototype UWORD _VERSION;
Prototype UWORD _REVISION;
Prototype UBYTE _DATE[];
Prototype UBYTE _VERS[];
Prototype UBYTE _VSTRING[];
Prototype UBYTE _VERSTAG[];
Prototype UWORD putChProc[];
Prototype BOOL GUIActive;
Prototype struct FileRequester *FR;
Prototype struct rtReqInfo *RTFR;
Prototype struct Library *ReqToolsBase;
Prototype struct Library *WorkbenchBase;
Prototype struct IntuiMessage IM;
Prototype struct Gadget *Gad;
/* Variables and data */
UBYTE *VersionTag = VERSTAG;
ULONG stream[99], aa[ARG_AMT], WaitFlags, SigFlag_IDCMP;
UBYTE CurFileLoaded[256+4];
BOOL NoFileToLoad = TRUE;
UWORD _VERSION = VERSION; /* Global version data, all modules should refer to these variables */
UWORD _REVISION = REVISION;
UBYTE _DATE[] = DATE;
UBYTE _VERS[] = VERS;
UBYTE _VSTRING[] = VSTRING;
UBYTE _VERSTAG[] = VERSTAG;
struct VCtrl VC;
struct Process *Proc;
struct WBStartup *HexyWBMsg = NULL;
struct RDArgs *ArgInfo = NULL;
struct MsgPort *WinPort;
UWORD putChProc[] = { 0x16c0, 0x4e75 };
BOOL GUIActive = FALSE;
struct FileRequester *FR = NULL;
struct rtReqInfo *RTFR = NULL;
struct Library *ReqToolsBase;
struct Library *WorkbenchBase;
struct Library *GadToolsBase;
struct Library *AslBase;
struct Library *CxBase;
struct Library *UtilityBase;
UBYTE CurrentUserDir[258+4];
UBYTE CurrentUserFile[258+4];
struct IntuiMessage IM;
struct Gadget *Gad;
BOOL running = TRUE;
LONG main( void )
{
/*************************************************
*
* Start of all our problems :-)
*
*/
Proc = (struct Process *) FindTask(NULL);
if (InitPrg())
{
if (ViewGUI())
{
ParseEvents();
FreeVC(&VC);
}
else VPrintf("Failed to initilize GUI!\n", NULL);
ClearGUI();
}
else VPrintf("Failed to initilize program!\n", NULL);
ExitPrg();
return RETURN_OK;
}
void wbmain( struct WBStartup *WBS )
{
HexyWBMsg = WBS;
main();
}
BOOL InitPrg( void )
{
/*************************************************
*
* Setup the program.
*
*/
WorkbenchBase = OpenLibrary("workbench.library", 39L);
if (!WorkbenchBase) return FALSE;
if (!HexyWBMsg)
{
ArgInfo = (struct RDArgs *)
ReadArgs(ARGPLATE, (LONG *) &aa, NULL);
if (aa[ARG_FILE] == NULL)
NoFileToLoad = TRUE;
else
NoFileToLoad = FALSE;
/*SetProgramName(VERS);*/
}
else NoFileToLoad = TRUE;
WinPort = (struct MsgPort *) CreateMsgPort();
if (!WinPort) return(FALSE);
SigFlag_IDCMP = (1 << WinPort->mp_SigBit);
if (!(GadToolsBase = OpenLibrary("gadtools.library", 39L)))
{
HexyInformation("Unable to open gadtools.library v39+", NULL);
return FALSE;
}
if (!(AslBase = OpenLibrary("asl.library", 39L)))
{
HexyInformation("Unable to open asl.library v39+", NULL);
return FALSE;
}
if (!(ReqToolsBase = OpenLibrary("reqtools.library", 38L)))
{
HexyInformation("Unable to open reqtools.library v38+", NULL);
return FALSE;
}
if (!(CxBase = OpenLibrary("commodities.library", 39L)))
{
HexyInformation("Unable to open commodities.library v39+", NULL);
return FALSE;
}
if (!(UtilityBase = OpenLibrary("utility.library", 39L)))
{
HexyInformation("Unable to open utility.library v39+", NULL);
return FALSE;
}
/* Setup the paths & filenames for the requester */
if (NoFileToLoad == FALSE)
{
/* If the user loaded a file via CLI params then extract path & name
from that string. */
strcpy( (UBYTE *) &CurrentUserDir, (UBYTE *) aa[ARG_FILE] );
strcpy( (STRPTR) &CurrentUserFile, FilePart((STRPTR) &CurrentUserDir) );
PathPart((STRPTR) &CurrentUserDir)[0] = 0;
}
else
{
/* Terminate file buffer */
CurrentUserFile[0] = 0;
if (!GetCurrentDirName( (STRPTR) &CurrentUserDir, 256))
{
CurrentUserDir[0] = 0; /* Null terminate buffer */
}
}
FR = (struct FileRequester *) AllocAslRequestTags(ASL_FileRequest,
ASLFR_SleepWindow, TRUE,
ASLFR_InitialDrawer, &CurrentUserDir,
ASLFR_InitialFile, &CurrentUserFile,
ASLFR_DoPatterns, "#?",
ASLFR_InitialPattern, "#?",
ASLFR_RejectIcons, FALSE,
TAG_DONE);
if (!FR) return(FALSE);
RTFR = (struct rtReqInfo *) rtAllocRequestA(RT_REQINFO, NULL);
if (!RTFR) return(FALSE);
if (!InitCX()) return(FALSE);
if (!InitApp()) return(FALSE);
return(TRUE);
}
void ExitPrg( void )
{
/*************************************************
*
* Close down program.
*
*/
FreeApp();
FreeCX();
if (FR) { FreeAslRequest(FR); FR = NULL; }
if (RTFR) { rtFreeRequest(RTFR); RTFR = NULL; }
if (WinPort) { DeleteMsgPort(WinPort); WinPort = NULL; }
if (ArgInfo) { FreeArgs(ArgInfo); ArgInfo = NULL; }
if (ReqToolsBase)
{
CloseLibrary(ReqToolsBase); ReqToolsBase = NULL;
}
if (UtilityBase)
{
CloseLibrary(UtilityBase); UtilityBase = NULL;
}
if (WorkbenchBase)
{
CloseLibrary(WorkbenchBase); WorkbenchBase = NULL;
}
if (GadToolsBase)
{
CloseLibrary(GadToolsBase); GadToolsBase = NULL;
}
if (AslBase)
{
CloseLibrary(AslBase); AslBase = NULL;
}
if (CxBase)
{
CloseLibrary(CxBase); CxBase = NULL;
}
}
void ParseEvents( void )
{
/*************************************************
*
* Process all signals for this task.
*
*/
struct IntuiMessage *TmpIM;
if (NoFileToLoad)
{
UBYTE *TempPath;
PrintStatus("Select a file to load...", NULL);
TempPath = ObtainInFile();
if (TempPath)
{
if (ReadFile(TempPath, &VC))
{
/*PrintStatus("File loaded OK", &stream);*/
}
}
}
else
{
if (ReadFile((UBYTE *) aa[ARG_FILE], &VC))
{
/*PrintStatus("File loaded OK", &stream);*/
}
}
/*PrintStatus("Do something...", NULL);*/
while(running)
{
ULONG SigEvent;
WaitFlags = (SigFlag_App | SigFlag_Cx |
SigFlag_IDCMP | SIGBREAKF_CTRL_C);
SigEvent = Wait(WaitFlags);
if (SigEvent & SigFlag_IDCMP)
{
while (TmpIM = (struct IntuiMessage *) GT_GetIMsg(WinPort))
{
CopyMem(TmpIM, &IM, sizeof(struct IntuiMessage));
Gad = IM.IAddress;
GT_ReplyIMsg(TmpIM);
if ((IM.IDCMPWindow == MAINWnd) && EditFlag)
{
if (Edit_DoEditIDCMP(&IM)) continue;
}
if (IDCMP_CheckRAWKEYS()) continue;
if (IM.IDCMPWindow == MAINWnd) IDCMP_MAIN();
else if (IM.IDCMPWindow == JUMPWnd) IDCMP_JUMP();
else if (IM.IDCMPWindow == FINDWnd) IDCMP_FIND();
else if (IM.IDCMPWindow == HUNKLISTWnd) IDCMP_HUNKLIST();
}
}
else if (SigEvent & SigFlag_App) DoAppEvent();
else if (SigEvent & SigFlag_Cx) if (DoCxEvent()) running = FALSE;
else if (SigEvent & SIGBREAKF_CTRL_C) running = FALSE;
continue;
}
}
#define ESC 0x1B /* Escape key */
void IDCMP_MAIN( void )
{
/*************************************************
*
* Handle IDCMP for main window.
*
*/
if (Edit_DoEditIDCMP(&IM)) return;
switch(IM.Class)
{
case IDCMP_VANILLAKEY:
switch((UBYTE)IM.Code)
{
case ESC: /* ESC */
case 'Q':
case 'q':
running = FALSE;
break;
}
break;
case IDCMP_CLOSEWINDOW:
running = FALSE;
break;
case IDCMP_REFRESHWINDOW:
MAINRender();
break;
case IDCMP_MENUPICK: /* Control Hexy's menus */
{
BOOL menudone = FALSE;
UWORD menuNumber = IM.Code;
while ((menuNumber != MENUNULL) && (!menudone))
{
struct MenuItem *item = ItemAddress(MAINMenus, menuNumber);
UWORD menuNum = MENUNUM(menuNumber);
UWORD itemNum = ITEMNUM(menuNumber);
UWORD subNum = SUBNUM(menuNumber);
switch(menuNum)
{
/*****************************************/
case 0: /* Project */
{
switch(itemNum)
{
case 0: /* Load */
{
UBYTE *TempPath = ObtainInFile();
if (TempPath)
{
ReadFile(TempPath, &VC);
}
UpdateJumpWindow();
break;
}
case 1: break; /* BAR */
case 2: /* Save... */
SaveToNewLocation(&VC);
break;
case 3: /* Split save... */
SaveSplit(&VC);
break;
case 4: break; /* BAR */
case 5: /* Iconify */
DoIconify();
break;
case 6: break; /* BAR */
case 7: /* About */
{
struct EasyStruct AboutES =
{
sizeof(struct EasyStruct),
NULL,
"About Hexy...", VERS " (" DATE ")\n"
" Copyright © " YEAR " Andrew Bell\n"
"This is a beta version!",
"Continue"
};
EasyRequest(MAINWnd, &AboutES, NULL, NULL);
break;
}
case 8: /* Quit */
menudone = TRUE;
running = FALSE;
break;
}
break;
}
/*****************************************/
case 1: /* Control */
{
switch(itemNum)
{
case 0: ViewJumpWindow(); break;
case 1: ViewFindWindow(); break;
case 2: ViewHunkListWindow(); break;
default: break;
}
break;
}
default:
break;
}
menuNumber = item->NextSelect;
}
break;
}
case IDCMP_MOUSEMOVE:
switch(Gad->GadgetID)
{
case GD_GVDRAGBAR:
if (VC.VC_Mode == HEXYMODE_HEX)
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_HEX);
}
else
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_ASCII);
}
UpdateView(&VC, NULL);
UpdateJumpWindow();
break;
default:
break;
}
break;
case IDCMP_GADGETDOWN:
switch(Gad->GadgetID)
{
case GD_GVDRAGBAR:
if (VC.VC_Mode == HEXYMODE_HEX)
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_HEX);
}
else
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_ASCII);
}
UpdateView(&VC, NULL);
break;
}
break;
case IDCMP_GADGETUP:
{
ULONG MoveAmt;
if (VC.VC_Mode == HEXYMODE_HEX)
{
MoveAmt = XAMOUNT_HEX;
}
else
{
MoveAmt = XAMOUNT_ASCII;
}
switch(Gad->GadgetID)
{
case GD_GVDRAGBAR:
{
if (VC.VC_Mode == HEXYMODE_HEX)
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_HEX);
}
else
{
VC.VC_CurrentPoint = (ULONG)(IM.Code * XAMOUNT_ASCII);
}
UpdateView(&VC, NULL);
break;
}
case GD_GNEXTL:
AdjustView(&VC, MoveAmt); SetVDragBar(&VC);
break;
case GD_GPREVL:
AdjustView(&VC, -MoveAmt); SetVDragBar(&VC);
break;
case GD_GNEXTP:
AdjustView(&VC, MoveAmt * YLINES); SetVDragBar(&VC);
break;
case GD_GPREVP:
AdjustView(&VC, -(MoveAmt * YLINES)); SetVDragBar(&VC);
break;
case GD_GSEARCH:
ViewFindWindow();
break;
case GD_GQUIT:
running = FALSE;
break;
case GD_GMODE:
{
switch(IM.Code)
{
default:
case HEXYMODE_HEX:
Edit_WipeCursor();
VC.VC_Mode = HEXYMODE_HEX;
UpdateView(&VC, NULL);
break;
case HEXYMODE_ASCII:
Edit_WipeCursor();
VC.VC_Mode = HEXYMODE_ASCII;
UpdateView(&VC, NULL);
break;
}
if (EditFlag) Edit_ShiftCursor(0);
SetVDragBar(&VC);
break;
}
case GD_GEDIT:
{
ULONG TestFlag;
ULONG r = GT_GetGadgetAttrs(MAINGadgets[GD_GEDIT], MAINWnd, NULL,
GTCB_Checked, &TestFlag,
TAG_DONE);
if (r) if (TestFlag) Edit_Begin(); else Edit_End();
break;
}
}
UpdateJumpWindow();
break;
}
default:
;
} /* switch(CLASS) */
}
BOOL IDCMP_CheckRAWKEYS( void )
{
/*************************************************
*
* Check for global raw keys
*
*/
/*
* All keyboard shortcut should be placed into these procedures:
*
* IDCMP_KeyNavigation, controls Up/Dn/Lf/Rt arrows, etc.
* IDCMP_KeyControl, controls ESC key, HELP keys, etc.
*
* IDCMP_KeyNavigation is not called when EditMode is active because
* the Edit_DoEditIDCMP (aka Edit_DoEdit) handles edit cursor
* navigation.
*
* IDCMP_CheckRAWKEYS should then become obsolete.
*
*/
if (EditFlag) return(FALSE);
if (IM.Class == IDCMP_RAWKEY)
{
LONG Amount = NULL;
BOOL QFlag;
BOOL CFlag;
if ((IM.Qualifier & IEQUALIFIER_LSHIFT) ||
(IM.Qualifier & IEQUALIFIER_RSHIFT))
{
QFlag = TRUE;
}
else
{
QFlag = FALSE;
}
if (IM.Qualifier & IEQUALIFIER_CONTROL)
{
CFlag = TRUE;
}
else
{
CFlag = FALSE;
}
switch(IM.Code)
{
/* Add HELP etc here */
}
if (VC.VC_Mode == HEXYMODE_HEX)
{
switch(IM.Code)
{
case CURSORUP:
if (CFlag)
{
VC.VC_CurrentPoint = NULL;
Amount = NULL;
break;
}
else
{
if (QFlag)
Amount = -(XAMOUNT_HEX * YLINES);
else
Amount = -XAMOUNT_HEX;
break;
}
case CURSORDOWN:
if (CFlag)
{
VC.VC_CurrentPoint = VC.VC_FileLength - (XAMOUNT_HEX * YLINES);
Amount = NULL;
break;
}
else
{
if (QFlag)
Amount = (XAMOUNT_HEX*YLINES);
else
Amount = XAMOUNT_HEX;
break;
}
case CURSORLEFT:
if (QFlag) Amount = -4; else Amount = -1; break;
case CURSORRIGHT:
if (QFlag) Amount = 4; else Amount = 1; break;
default: break;
}
UpdateJumpWindow();
}
else
{
switch(IM.Code)
{
case CURSORUP:
if (QFlag) Amount = -(XAMOUNT_ASCII*YLINES); else Amount = -XAMOUNT_ASCII; break;
case CURSORDOWN:
if (QFlag) Amount = (XAMOUNT_ASCII*YLINES); else Amount = XAMOUNT_ASCII; break;
case CURSORLEFT:
if (QFlag) Amount = -4; else Amount = -1; break;
case CURSORRIGHT:
if (QFlag) Amount = 4; else Amount = 1; break;
default: break;
}
UpdateJumpWindow();
}
AdjustView(&VC, Amount);
SetVDragBar(&VC);
return(TRUE);
}
else
{
return(FALSE);
}
}
void DEBUG( void )
{
/*************************************************
*
* Special procedure use for debugging.
*
*/
/* This is a dummy function that is used for MonAm break points, etc. */
}
/*************************************************
*
*
*
*/